fastai lesson 1

读取数据

利用正则表达式

利用正则表达式从路径中提取文件名,文件名就作为label
get_transforms()的作用是 data augmentation,例如rotation, zoom, translation等其他方法,防止过拟合

1
2
3
4
5
6
7
8
9
10
11
12
# 举一个正则表达式的例子
pat = r'\\([a-z]+).\d+.jpg$'
pat = re.compile(pat)
img_path ='\\data\\dog.12247.jpg'
print(pat.search(img_path).group(1))
# output: 'dog'

# 实际使用时
path_img = 'C:\\Users\\hp\\.fastai\\data\\images'
fnames = get_image_files(path_img)
data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(), size=224,bs=bs)
data.normalize(imagenet_stats)

从文件夹中读取文件

要求文件夹的层次为path下有三个文件夹,分别命名为trainvalidtest,且 trainvalid 内文件夹有每个类别的文件夹,里面存着该类别的图片。

  • path
    • train
      • class1
      • class2
        • valid
      • class1
      • class2
        • test
1
2
data = ImageDataBunch.from_folder(path, train, valid, ds_tfms=get_transforms(), size, bs)
data.normalize(imagenet_stats)

从csv文件读取

ImageDataBunch.from_csv(path, ds_tfms=tfms, size=24)

从df读取

data = ImageDataBunch.from_df(path, df, ds_tfms=tfms, size=24)

可视化读取的文件

将读取的图片展示出来
data.show_batch(rows=3, figsize=(12,12))

利用预训练好的模型训练自己的任务

1
2
3
learn = create_cnn(data, models.resnet34, metrics=error_rate)
learn.model
learn.fit_one_cycle(4)

保存模型

learn.save(path) # path可以直接填想要命名的文件名,模型将被保存到训练数据的model文件夹内

理解模型

可视化模型在哪里犯的错最多,将哪些类别混淆的次数最多以改进模型

1
2
3
4
interp = ClassificationInterpretation.from_learner(learn)
interp.most_confused(min_val=2)
interp.plot_top_losses(9, figsize=(12,12))
interp.plot_confusion_matrix(figsize=(12,12), dpi=60)

改进模型

找到最大但不发散的学习率,解冻预训练模型,在自己的任务上继续训练,准确率往往会更进一步。

1
2
3
4
learn.lr_find()
learn.recorder.plot()
learn.unfreeze()
learn.fit_one_cycle(2, max_lr=slice(1e-6,1e-4))